FFC uses the optimized tensor representation by default when compiling your form.
Unfortunately this representation can result in floating point rounding errors for some forms due to expansion of terms such as (a-b)2 into a2 + b**2 - 2ab.
To get around this problem, either ask ffc to use the "quadrature" representation on the commandline:
ffc -r quadrature MyFile.ufl
or equivalently pass the option as metadata to your form by adding this line to the top of your .ufl file
dxq = Measure("dx", metadata={"representation": "quadrature"})
and use dxq instead of dx in the norm forms. That should fix the negative norms.
Besides that, MiroK's answer is sound advice, which will get you the norm piecewise constant for each cell. You may also want to scale the norm with 1/CellVolume(cell), depending on what you're looking for.